home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-11 | 3.2 KB | 219 lines | [TEXT/KAHL] |
- /***
- *
- * Exceptions.cp
- * Copyright © 1992-1995 by Christopher E. Hyde. All rights reserved.
- *
- * Version: 1.07 12/95
- *
- ***/
-
- #include "Exceptions.h"
-
- #undef qDebug
- #define qDebug 0
- #define qExtras 0
-
- #ifndef qNoExceptionGlobals
- FailInfo* gTopHandler = nil; // Pointer to the top level (most recent) handler
- short gFailE = 0;
- long gFailM = 0;
- #endif
-
-
- pascal void
- FailMemError (void)
- {
- OSErr err = MemError();
-
- if (err != noErr) Fail(err);
- }
-
-
- pascal void
- FailNil (void* p)
- {
- if (p == nil) Fail(memFullErr);
- }
-
-
- #if qExtras
- pascal void
- FailNilResource (void* r)
- {
- if (r == nil) {
- OSErr err = ResError();
- Fail((err != noErr) ? err : resNotFound); // Fix bug in Resource manager
- }
- }
-
-
- pascal void
- FailOSErr (OSErr err)
- {
- if (err != noErr) Fail(err);
- }
-
-
- pascal void
- FailResError (void)
- {
- OSErr err = ResError();
-
- if (err != noErr) Fail(err);
- }
-
-
- pascal void
- FailNewMessage (short err, long oldMessage, long newMessage)
- {
- if (oldMessage == 0) oldMessage = newMessage;
- Failure(err, oldMessage);
- }
- #endif
-
-
- #if qNoAssembler
-
- //extern "C" void DoRetry (FailInfo* fi);
- //#pragma noreturn(DoRetry)
-
- #if qDebug
- static void NoHandler (void);
- #pragma noreturn(NoHandler)
- #else
- #define NoHandler() ExitToShell()
- #pragma noreturn(ExitToShell)
- #endif
-
- extern "C" {
-
- #pragma parameter DoFailure(__A1)
- pascal void DoFailure (FailInfo* fi) = {
- 0x4CD1, 0xDDFC, // MOVEM.L (A1),D2-D7/A0/A2-A4/A6/A7
- 0x7000, // MOVEQ #0,D0
- 0x4ED0 // JMP (A0)
- };
- #pragma noreturn(DoFailure)
-
- #pragma parameter DoRetry(__A1)
- pascal void DoRetry (FailInfo* fi) = {
- 0x4CD1, 0xDDFC, // MOVEM.L (A1),D2-D7/A0/A2-A4/A6/A7
- 0x7001, // MOVEQ #1,D0
- 0x4ED0 // JMP (A0)
- };
- #pragma noreturn(DoRetry)
-
- }
-
-
- void
- Fail (short err)
- {
- // Failure(err, 0);
- gFailE = err;
- gFailM = 0;
- Failure();
- }
-
-
- #if qExtras
- void
- Failure (short err, long message)
- {
- gFailE = err;
- gFailM = message;
- Failure();
- }
- #endif
-
-
- void
- Failure (void)
- {
- FailInfo* fi = gTopHandler;
-
- if (fi /*!= nil*/) {
- gTopHandler = fi->nextInfo; // Pop the stack first,
- DoFailure(fi); // Go execute the failure handler
- } else
- NoHandler();
- }
-
-
- #if qExtras
- pascal bool
- HandlerExists (FailInfo* testFi)
- {
- for (FailInfo* fi = gTopHandler; fi != nil; fi = fi->nextInfo)
- if (fi == testFi) return true;
- return false;
- }
-
-
- void
- Success (FailInfo* fi)
- {
- if (gTopHandler)
- gTopHandler = fi->nextInfo;
- else
- NoHandler();
- }
- #endif
-
-
- void
- Success (void)
- {
- // Success(gTopHandler);
- if (gTopHandler)
- gTopHandler = gTopHandler->nextInfo; // Pop the top failure handler
- }
-
-
- // Pushes a handler back on the stack, resets the error and message to zero, and invokes
- // the handler. This has the effect of re-executing the TRY block for the handler.
- pascal void
- Retry (FailInfo* fi)
- {
- gFailE = noErr;
- gFailM = 0;
-
- fi->nextInfo = gTopHandler;
- gTopHandler = fi;
-
- DoRetry(fi);
- }
-
-
- #if qDebug
- // Signals fatal error caused by a call to Failure() or Success(FailInfo*) when the handler stack is empty.
- static void
- NoHandler (void)
- {
- DebugStr("\pFailure stack is empty!");
-
- ExitToShell();
- }
- #endif
-
-
- #endif // qNoAssembler
-
-
- #if qExtras
- pascal void
- ProgramBreak (ConstStr255Param grievance)
- {
- SysBeep(1);
- DebugStr(grievance);
- }
-
-
- pascal void
- ProgramReport (ConstStr255Param grievance, bool brk)
- {
- SysBeep(1);
- DebugStr(grievance);
- }
- #endif
-